#include "b_config.h"
#include "hal/inc/b_hal_gpio.h"
#include "ciu32f003_std_gpio.h"
#include "ciu32f003_std_rcc.h"
// 映射函数
// static en_gpio_port_t MapToVendorGPIO(bHalGPIOPort_t port)
// {
//     switch (port)
//     {
//         case B_HAL_GPIOA:
//             return GpioPort0;
//         case B_HAL_GPIOB:
//             return GpioPort1;
//         case B_HAL_GPIOC:
//             return GpioPort2;
//         case B_HAL_GPIOD:
//             return GpioPort3;
//         default:
//             return (en_gpio_port_t)-1;  // 返回一个无效值
//     }
// }

void bMcuGpioConfig(bHalGPIOPort_t port, bHalGPIOPin_t pin, bHalGPIODir_t dir, bHalGPIOPull_t pull)
{
    std_gpio_init_t led_gpio_init = {0};
    if (port == B_HAL_GPIOA)
    {
        std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOA);
    }
    else if (port == B_HAL_GPIOB)
    {
        std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOB);
    }
    else if (port == B_HAL_GPIOC)
    {
        std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOC);
    }


    led_gpio_init.pin = 0x01 << pin;
    if (B_HAL_GPIO_OUTPUT == dir)
    {
        led_gpio_init.mode = GPIO_MODE_OUTPUT;
    }
    else
    {
        led_gpio_init.mode = GPIO_MODE_INPUT;
    }
    if (B_HAL_GPIO_PULLUP == pull)
    {
        led_gpio_init.pull = GPIO_PULLUP;
    }
    else if (B_HAL_GPIO_PULLDOWN == pull)
    {
        led_gpio_init.pull = GPIO_PULLDOWN;
    }
    else
    {
        led_gpio_init.pull = GPIO_NOPULL;
    }
    led_gpio_init.output_type = GPIO_OUTPUT_PUSHPULL;

    /* ³õÊ¼»¯GPIO */
    std_gpio_init((GPIO_t *)(GPIO_BASE + (port * 0x400)), &led_gpio_init);
    // b_log("bMcuGpioConfig: %d, %d, %d, %d\n", port, pin, dir, pull);
    // b_log("GPIO_BASE + (port * 0x400): %p\n", (GPIO_t *)(GPIO_BASE + (port * 0x400)));
    // b_log("led_gpio_init.pin: %d\n", led_gpio_init.pin);
}

void bMcuGpioWritePin(bHalGPIOPort_t port, bHalGPIOPin_t pin, uint8_t s)
{
    GPIO_t *pGpio = (GPIO_t *)(GPIO_BASE + (port * 0x400));
    if (!B_HAL_GPIO_ISVALID(port, pin))
    {
        return;
    }

    if (s)
    {
        std_gpio_set_pin(pGpio, GPIO_PIN_0 << pin);
    }
    else
    {
        std_gpio_reset_pin(pGpio, GPIO_PIN_0 << pin);
    }

}

void bMcuGpioWritePort(bHalGPIOPort_t port, uint16_t dat)
{
    ;
}

uint8_t bMcuGpioReadPin(bHalGPIOPort_t port, bHalGPIOPin_t pin)
{
  //  b_log("bMcuGpioReadPin: %d, %d, %d", port, pin, std_gpio_get_input_pin((GPIO_t *)(GPIO_BASE + (port * 0x400)), GPIO_PIN_0 << pin));
    return std_gpio_get_input_pin((GPIO_t *)(GPIO_BASE + (port * 0x400)), (0x01 << pin));
}

uint16_t bMcuGpioReadPort(bHalGPIOPort_t port)
{
    return 0;
}
